#ifndef _KC_HTML_TREE__H_KC_2010_
#define _KC_HTML_TREE__H_KC_2010_

#include "HtmlTag.h"
#include "Node.h"

namespace kc_sf
{

class HtmlReader;

/**
 * Sprawdzenie poprawności: (funkcja addNode)
 * - czy tag, który musi posiadać rodzica posiada go
 * - czy tag zamykający kończy prawidłowy tag otwierający
 */
class HtmlTree {
public:

	HtmlTree();
	explicit HtmlTree(const HtmlTag &tag);
	HtmlTree(const HtmlTree &tree);
	HtmlTree & operator=(const HtmlTree &tree);
	~HtmlTree();

	void setRoot(const HtmlTag &tag) {
		ht_root = new Node<HtmlTag> (tag);
	}

	bool addNode(const HtmlTag &child);
	bool addContent(const std::string &content);
	void deleteActNodeChildrenNodes();

	Node<HtmlTag> & root() {
		return *ht_root;
	}

	const Node<HtmlTag> & root() const{
		return *ht_root;
	}

	bool isFullTree() const {	// czy drzewo zostało poprawnie skonstruowane, w err_tag zapisany nie zamknięty tag
		return ht_root == ht_act_node;
	}

	bool isFullTree(HtmlTag &err_tag) const {	// czy drzewo zostało poprawnie skonstruowane, w err_tag zapisany nie zamknięty tag
		err_tag = *ht_act_node;
		return ht_root == ht_act_node;
	}

	friend class HtmlReader;

	friend std::ostream & operator<< (std::ostream &out, const HtmlTree &tree);

private:

	Node<HtmlTag> *ht_root;
	Node<HtmlTag> *ht_act_node;

	void copyNodeAndChildren(const Node<HtmlTag> &node);
	std::ostream & print(std::ostream &out, const Node<HtmlTag> &node, int depth) const;
};

}

#endif // _KC_HTML_TREE__H_KC_2010_
